#include "TableauDynamique.h"
#include <stdlib.h>
#include <stdio.h>


void initialiserTabDyn(TableauDynamique * pTab){

    pTab->capacite=1;
    pTab->ad=(ElementTD *)malloc(sizeof(ElementTD));
    pTab->taille_utilisee=0;
    pTab->ad[0]=NULL;

}

void testamentTabDyn(TableauDynamique * pTab){

    pTab->capacite=0;
    pTab->taille_utilisee=0;
    free(pTab->ad);

}

void affecterTabDyn(TableauDynamique * pTab1,const TableauDynamique * pTab2){
    int i;
    pTab1->capacite=pTab2->capacite;
    pTab1->taille_utilisee=pTab2->taille_utilisee;
    for(i=0;i<pTab1->taille_utilisee;i++){

        pTab1->ad[i]=pTab2->ad[i];
    }
}

unsigned int tailleUtiliseeTabDyn(const TableauDynamique * pTab){

        return pTab->taille_utilisee;
}

ElementTD valeurIemeElementTabDyn(const TableauDynamique * pTab,unsigned int i){

    return pTab->ad[i];
}


void ajouterElementTabDyn(TableauDynamique * pTab,ElementTD e){

TableauDynamique * pNewTab;


    if(pTab->capacite == pTab->taille_utilisee){

        pNewTab=(TableauDynamique *)malloc(sizeof(TableauDynamique));
        pNewTab->ad=(ElementTD *)malloc(2*pTab->capacite * sizeof(ElementTD));


        affecterTabDyn(pNewTab,pTab);
        free(pTab->ad);
        pTab->ad=pNewTab->ad;
        pTab->capacite=pTab->capacite*2;
        free(pNewTab);

    }
    pTab->ad[pTab->taille_utilisee]=e;
    pTab->taille_utilisee++;

}

void supprimerElementTabDyn(TableauDynamique * pTab,int pos){

    if(pos<pTab->taille_utilisee){
        int i;
        TableauDynamique * pNewTab;
        pTab->taille_utilisee--;
        if(pTab->taille_utilisee<pTab->capacite/3){

            pNewTab=(TableauDynamique *)malloc(sizeof(TableauDynamique));
            pNewTab->ad=(ElementTD *)malloc((pTab->capacite/2)*sizeof(ElementTD));


            affecterTabDyn(pNewTab,pTab);
            free(pTab->ad);
            pTab->ad=pNewTab->ad;
            pTab->capacite=pTab->capacite/2;

        }

        for(i=pos;i<pTab->taille_utilisee;i++){

            pTab->ad[i]=pTab->ad[i+1];
        }
    }
    if(pTab->taille_utilisee==0)
        pTab->ad[0]=NULL;
}
void insererElementTabDyn(TableauDynamique * pTab, ElementTD e, unsigned int i){
    int j;
    for(j=pTab->taille_utilisee;j>i;j--){

        pTab->ad[j]=pTab->ad[j-1];
    }
    pTab->ad[i]=e;
    pTab->taille_utilisee++;

}

int testElementAppartienTabDyn(const TableauDynamique * pTab,ElementTD pE){

    int i;
    for(i=0;i<pTab->taille_utilisee;i++){

        if(pTab->ad[i]==pE) return 1;


    } return 0;
}

void dynTabPermutation(TableauDynamique * pTab){

    ElementTD e;

    if(pTab->taille_utilisee != 0){
        e=pTab->ad[(pTab->taille_utilisee)-1];
        supprimerElementTabDyn(pTab,(pTab->taille_utilisee)-1);
        insererElementTabDyn(pTab,e,0);
    }


}
int dynTabPositionElement(const TableauDynamique * pTab,ElementTD e){
    int i;
    if(pTab->taille_utilisee !=0){
        for(i=0;i<pTab->taille_utilisee;i++){
            if(pTab->ad[i]==e) return i;

        }

    }

return -1;
}

void dynTabTestRegression(){

	TableauDynamique tabDyn;
	Monster * tabMonsters;
	int nb_monsters,i;
	printf("****** TEST TabDyn START ************ \n");

	tabMonsters = monsterTabInit(&nb_monsters,1);

	initialiserTabDyn(&tabDyn);

	for(i=0;i<nb_monsters;i++){

		ajouterElementTabDyn(&tabDyn,&tabMonsters[i]);

	}
	if(tailleUtiliseeTabDyn(&tabDyn) == nb_monsters && valeurIemeElementTabDyn(&tabDyn,0) == &(tabMonsters[0])){
		printf("Module travaille correctement......\n");
	}else{
		printf("Attention! Module erreur......\n");
	}
	monsterFree(tabMonsters,nb_monsters);
	testamentTabDyn(&tabDyn);
	printf("****** TEST TabDyn END ************** \n");

}


